package mb.admin.dao;

import java.sql.SQLException;
import java.util.ArrayList;

import javax.xml.xpath.XPathExpressionException;

import mb.admin.data.UserData;
import mb.commons.AbstractDAO;
import mb.commons.DbConnection;
import mb.commons.XmlHelper;

/**
 * Klasa dostępu do bazy danych dla widoku admin/użytkownicy
 * @author Michał Budziło
 *
 */
/**
 * @author Michał Budziło
 *
 */
public class UserDAO  extends AbstractDAO{
	
	/**
	 * Konstruktor
	 */
	public UserDAO() {
		conn = DbConnection.getConnection();
		helper = new XmlHelper("WEB-INF/xml/admin/users.xml");
	}

	/**
	 * Metoda zwraca z bazy danych listę użytkowników
	 * @return lista użytkowników
	 */
	public ArrayList<UserData> getUserList() {
		ArrayList<UserData> list = new ArrayList<UserData>();
		UserData data;
		try {
			query = helper.getSqlString("userList",
					"sqlString/prepareMain/sql");
			stmt = conn.createStatement();
			rs = stmt.executeQuery(query);
			while (rs.next()) {
				data = new UserData();
			
				data.setId(rs.getInt(1));
				data.setLogin(rs.getString(2));
				data.setHaslo(rs.getString(3));
				data.setMail(rs.getString(4));
				data.setRodzaj(rs.getString(5));
				data.setDataRej(rs.getDate(6));
				data.setDataOstatLog(rs.getDate(7));
				list.add(data);
			}
			return list;
		} catch (SQLException e) {
			error(e.getErrorCode() + " : " + e.getMessage());
			e.printStackTrace();
		} catch (XPathExpressionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			close();
		}
		return null;
	}
	
	
	/**
	 * Metoda wstawia do bazy danych nowego użytkownika
	 * @param data obiekt klasy użytkownik
	 */
	public void insertData(UserData data) {
		try {
			query = helper.getSqlString("insertData","sqlString/prepareMain/prepareStatment");
			prepStmt = conn.prepareStatement(query);
			prepStmt.setString(1, data.getLogin());
			prepStmt.setString(2, data.getHaslo());
			prepStmt.setString(3, data.getMail());
			prepStmt.setString(4, data.getRodzaj());

		
			prepStmt.executeUpdate();
			
		} catch (SQLException e) {
			error(e.getErrorCode() + " : " + e.getMessage());
			e.printStackTrace();
		} catch (XPathExpressionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			
			close();
		}
		
	}
	
	 /**
	  * Metoda aktualizuje w bazie danych wybranego użytkownika
	 * @param data obiekt klasy użytkownik
	 */
	public void updateData(UserData data) {
		try {
			query = helper.getSqlString("updateData","sqlString/prepareMain/prepareStatment");
			prepStmt = conn.prepareStatement(query);
			
			prepStmt.setString(1,data.getLogin() )	;
			prepStmt.setString(2, data.getHaslo())	;
			prepStmt.setString(3, data.getMail())	;
			prepStmt.setString(4, data.getRodzaj())	;
			prepStmt.setDate(5, data.getDataRej())	;
			prepStmt.setDate(6,data.getDataOstatLog() )	;
			prepStmt.setInt(7, data.getId())	;
			
			
			prepStmt.executeUpdate();
			
		} catch (SQLException e) {
			error(e.getErrorCode() + " : " + e.getMessage());
			e.printStackTrace();
		} catch (XPathExpressionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			
			close();
		}
		
	}
	 
	 /**
	  * Metoda usuwa z bazy danych wybranego użytkownika
	 * @param data obiekt klasy użytownik
	 */
	public void deleteData(UserData data) {
			
			try {
				query = helper.getSqlString("deleteData","sqlString/prepareMain/prepareStatment");
				prepStmt = conn.prepareStatement(query);
				prepStmt.setInt(1, data.getId());
				
				prepStmt.executeUpdate();
				
			} catch (SQLException e) {
				if(e.getErrorCode()==1451)
				{
					error("Nie można usunąć użytkownika, przypisany jest do niego klient/kurier lub admin. ");
				}else
				{
				error(e.getErrorCode() + " : " + e.getMessage());
				e.printStackTrace();
				}
			} catch (XPathExpressionException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {
				
				close();
			}
		}
	 
	
}
